#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>


// int main(){
//     while(1){
//         printf("hello vscode!\n");
//         sleep(1);
//     }

//     return 0;
// }

// void handler(int signo)
// {
//     printf("get a signal no is:%d", signo, getpid());
// }

// int main()
// {
//     signal(2, handler);//替换二号信号
//     while(1)
//     {
//         printf("hello world! my pid is: %d\n", getpid());
//         sleep(1);
//     }

//     return 0;
// }

// void handler(int signo)
// {
//     printf("get a signal: signal no is: %d\n", signo, getpid());
//     exit(0);
// }

// int main()
// {
//     //替换2号进程
//     int i = 0;
//     for(i = 0; i < 32; i++){
//         signal(i, handler);
//     }

//     while(1){
//         printf("hello world! my pid is : %d\n", getpid());
//         sleep(1);
//     }
//     return 0;
// }

// void handler(int signo)
// {
//     printf("signo is : %d   pid is : %d\n", signo, getpid());
// }

// int main()
// {
//     int i = 0;
//     for(; i < 32; i++){
//         signal(i, handler);
//     }

//     //情况1
//    // int *p = NULL;
//     //*p = 100;

//     //情况2
//     int a = 100; 
//     a /= 0;
//     return 0;
// }

//进程被不同信号杀死不一定会生成core文件
// int main()
// {
//     while(1){
//         printf("pid is %d\n", getpid());
//         sleep(2);
//     }

//     return 0;
// }

// int main()
// {
//     int count = 3;
//     while(1){
//         if(count == 0){
//             kill(getpid(), 9);
//         }
//         printf("my pid is:%d  count : %d\n", getpid(), count);
//         sleep(1);
//         count--;
//     }
//     return 0;
// }

#include<sys/types.h>

// int main()
// {
//     printf("my pid is %d\n", getpid());
//     sleep(3);

//     // //raise函数可以给进程自己发送信号
//     // raise(9);
   
//    //abort函数可以给进程自己发送SIGABRT信号，让进程异常终止
//    abort();
   
//     return 0;
// }

// int main()
// {
//     sigset_t iset;


//     //通过这个进程我们可以知道，9号信号不可被阻塞
//     sigemptyset(&iset);
//     sigaddset(&iset, 2);
//     sigaddset(&iset, 9);
//     sigprocmask(SIG_SETMASK, &iset, NULL);

//     while(1)
//     {
//         printf("hello world, my pid is: %d\n", getpid());
//         sleep(1);
//     }
//     return 0;


// }

// void printPending(sigset_t *pending)
// {
//     int i = 1;
//     for(i = 1; i<=31; i++)
//     {
//         if(sigismember(pending, i)) printf("1 ");
//         else printf("0 ");
//     }

//     printf("\n");
// }
// int main()
// {
    
//     sigset_t set, oset;
//     sigemptyset(&set);
//     sigemptyset(&oset);//初始化信号集

//     sigaddset(&set, 2);//放置2号信号
//     sigprocmask(SIG_SETMASK, &set, &oset);//阻塞2号信号

//     sigset_t pending;
//     sigemptyset(&pending);

//     while(1){
//         sigpending(&pending);//获取pending
//         printPending(&pending);//打印pending位图，1表示未决
//         sleep(1);
//     }
//     return 0;
// }

// //捕获2号信号，观察变化过程
// void printPending(sigset_t *pending)
// {
//     int i = 1;
//     for(i = 1; i <= 31; i++){
//         if(sigismember(pending, i)) printf("1 ");
//         else printf("0 ");
//     }
//     printf("\n");
// }

// void handler(int signo)
// {
//     printf("handler signo:%d\n", signo);
// }

// int main()
// {
//     signal(2, handler);
//     sigset_t set, oset;
//     sigemptyset(&set);
//     sigisemptyset(&oset);//初始化信号集

//     sigaddset(&set, 2);//加入2号信号
//     sigprocmask(SIG_SETMASK, &set, &oset);//阻塞信号

//     sigset_t pending;
//     sigemptyset(&pending);

//     printf("pid是:   %d   !!\n", getpid());
    

//     int count = 0;
//     while(1){
//         sigpending(&pending);//获取pending
//         printPending(&pending);//打印位图
//         sleep(1);
//         count++;
//         if(count == 20){
//             sigprocmask(SIG_SETMASK, &oset, NULL);//恢复信号屏蔽字
//             printf("恢复信号屏蔽字");
//         }
//     }

//     return 0;
// }

//使用sigaction函数进行信号捕捉，下面例子中，一开始屏蔽2号信号，第2次收到时就恢复
struct sigaction act, oact;
void handler(int signo)
{
    printf("get a signal :%d\n", signo);
    sigaction(2, &oact, NULL);
}
#include<string.h>
int main()
{
    memset(&act, 0, sizeof(act));
    memset(&oact, 0, sizeof(oact));

    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);

    sigaction(2, &act, &oact);
    while(1){
        printf("I am a process...\n");
        sleep(1);
    }

    return 0;
}
